package com.empire.framework.mybatis.core.handler;

import com.empire.framework.mybatis.core.dataobject.BaseDO;
import com.empire.framework.mybatis.core.dataobject.BaseWithDeptDO;
import com.empire.framework.security.core.util.SecurityFrameworkUtils;
import com.empire.framework.web.core.util.WebFrameworkUtils;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 通用参数填充实现类
 *
 * 如果没有显式的对通用参数进行赋值，这里会对通用参数进行填充、赋值
 *
 * @author hexiaowu
 */
public class DefaultDBFieldHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (Objects.isNull(metaObject)) {
            return; // 提前退出：metaObject无效时无需处理
        }

        Object originalObject = metaObject.getOriginalObject();
        LocalDateTime currentTime = LocalDateTime.now(); // 统一获取当前时间，避免重复计算
        Long userId = WebFrameworkUtils.getLoginUserId(); // 统一获取用户ID

        // 1. 处理BaseWithDeptDO（假设其继承自BaseDO，先处理子类逻辑）
        if (originalObject instanceof BaseWithDeptDO withDeptDO) {
            // 先填充BaseDO的公共字段（复用父类逻辑）
            fillBaseDOFields(withDeptDO, currentTime, userId);
            // 补充BaseWithDeptDO特有字段：创建部门ID
            Long deptId = SecurityFrameworkUtils.getLoginUserDeptId();
            if (Objects.nonNull(deptId)) {
                withDeptDO.setCreateDeptId(deptId);
            }
            return; // 处理完子类后直接返回，避免重复处理父类
        }

        // 2. 处理BaseDO（父类逻辑）
        if (originalObject instanceof BaseDO baseDO) {
            fillBaseDOFields(baseDO, currentTime, userId);
        }
    }

    /**
     * 提取BaseDO的公共填充逻辑
     * @param baseDO 基础实体
     * @param currentTime 当前时间
     * @param userId 当前登录用户ID
     */
    private void fillBaseDOFields(BaseDO baseDO, LocalDateTime currentTime, Long userId) {
        // 填充创建时间
        if (Objects.isNull(baseDO.getCreateTime())) {
            baseDO.setCreateTime(currentTime);
        }
        // 填充更新时间
        if (Objects.isNull(baseDO.getUpdateTime())) {
            baseDO.setUpdateTime(currentTime);
        }
        // 填充创建人
        if (Objects.nonNull(userId) && Objects.isNull(baseDO.getCreator())) {
            baseDO.setCreator(userId.toString());
        }
        // 填充更新人
        if (Objects.nonNull(userId) && Objects.isNull(baseDO.getUpdater())) {
            baseDO.setUpdater(userId.toString());
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 更新时间为空，则以当前时间为更新时间
        Object modifyTime = getFieldValByName("updateTime", metaObject);
        if (Objects.isNull(modifyTime)) {
            setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        }

        // 当前登录用户不为空，更新人为空，则当前登录用户为更新人
        Object modifier = getFieldValByName("updater", metaObject);
        Long userId = WebFrameworkUtils.getLoginUserId();
        if (Objects.nonNull(userId) && Objects.isNull(modifier)) {
            setFieldValByName("updater", userId.toString(), metaObject);
        }
    }
}
